﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOPresupuestos
    /// </summary>
    class DAOIMPLPresupuestos : Presupuesto_DAO.DAOPresupuestos
    {
        /// <summary>
        /// Guarda un presupuesto
        /// </summary>
        /// <param name="tipo_presupuesto">Tipo de presupuesto</param>
        /// <param name="codigo">Código del presupuesto</param>
        /// <param name="precio">Precio del presupuesto</param>
        /// <param name="fecha">Fecha de alta del presupuesto</param>
        /// <param name="estado">Estado del presupuesto</param>
        /// <param name="forma_pago">Forma de pago</param>
        /// <param name="plazo_entrega">Plazo de entrega</param>
        /// <param name="ejecucion_trabajo">Ejecución del trabajo</param>
        /// <param name="condiciones_generales">Condiciones generales</param>
        /// <param name="es_proforma">Determina si es una proforma</param>
        /// <param name="cif">Precio CIF de la proforma</param>
        /// <param name="fob">Precio FOB de la proforma</param>
        /// <param name="cod_factura">Código de factura de la proforma</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuesto(string tipo_presupuesto, string codigo, double precio, DateTime fecha, string estado, string forma_pago, string plazo_entrega, string ejecucion_trabajo, string condiciones_generales, bool es_proforma, double cif, double fob, string cod_factura, bool activo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO presupuestos(tipo_presupuesto, codigo, precio, fecha, estado, forma_pago, plazo_entrega, ejecucion_trabajo, condiciones_generales, es_proforma, cif, fob, cod_factura, activo)"
                                        + "VALUES(@tipo_presupuesto, @codigo, @precio, @fecha, @estado, @forma_pago, @plazo_entrega, @ejecucion_trabajo, @condiciones_generales, @es_proforma, @cif, @fob, @cod_factura, @activo)";
                insertar.Parameters.AddWithValue("@tipo_presupuesto", tipo_presupuesto);
                insertar.Parameters.AddWithValue("@codigo", codigo);
                insertar.Parameters.AddWithValue("@precio", precio);
                insertar.Parameters.AddWithValue("@fecha", fecha);
                insertar.Parameters.AddWithValue("@estado", estado);
                insertar.Parameters.AddWithValue("@forma_pago", forma_pago);
                insertar.Parameters.AddWithValue("@plazo_entrega", plazo_entrega);
                insertar.Parameters.AddWithValue("@ejecucion_trabajo", ejecucion_trabajo);
                insertar.Parameters.AddWithValue("@condiciones_generales", condiciones_generales);
                insertar.Parameters.AddWithValue("@es_proforma", es_proforma);
                insertar.Parameters.AddWithValue("@cif", cif);
                insertar.Parameters.AddWithValue("@fob", fob);
                insertar.Parameters.AddWithValue("@cod_factura", cod_factura);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un presupuesto
        /// </summary>
        /// <param name="tipo_presupuesto">Tipo de presupuesto</param>
        /// <param name="codigo">Código del presupuesto</param>
        /// <param name="precio">Precio del presupuesto</param>
        /// <param name="fecha">Fecha de alta del presupuesto</param>
        /// <param name="estado">Estado del presupuesto</param>
        /// <param name="forma_pago">Forma de pago</param>
        /// <param name="plazo_entrega">Plazo de entrega</param>
        /// <param name="ejecucion_trabajo">Ejecución del trabajo</param>
        /// <param name="condiciones_generales">Condiciones generales</param>
        /// <param name="es_proforma">Determina si es una proforma</param>
        /// <param name="cif">Precio CIF de la proforma</param>
        /// <param name="fob">Precio FOB de la proforma</param>
        /// <param name="cod_factura">Código de factura de la proforma</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <param name="id">Determina el presupuesto a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuesto(string tipo_presupuesto, string codigo, double precio, DateTime fecha, string estado, string forma_pago, string plazo_entrega, string ejecucion_trabajo, string condiciones_generales, bool es_proforma, double cif, double fob, string cod_factura, bool activo, int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE presupuestos SET tipo_presupuesto = @tipo_presupuesto, codigo = @codigo, precio = @precio, fecha = @fecha, estado = @estado, forma_pago = @forma_pago, plazo_entrega = @plazo_entrega, ejecucion_trabajo = @ejecucion_trabajo, condiciones_generales = @condiciones_generales, es_proforma = @es_proforma, cif = @cif, fob = @fob, cod_factura = @cod_factura, activo = @activo WHERE id = @id";
                modificar.Parameters.AddWithValue("@tipo_presupuesto", tipo_presupuesto);
                modificar.Parameters.AddWithValue("@codigo", codigo);
                modificar.Parameters.AddWithValue("@precio", precio);
                modificar.Parameters.AddWithValue("@fecha", fecha);
                modificar.Parameters.AddWithValue("@estado", estado);
                modificar.Parameters.AddWithValue("@forma_pago", forma_pago);
                modificar.Parameters.AddWithValue("@plazo_entrega", plazo_entrega);
                modificar.Parameters.AddWithValue("@ejecucion_trabajo", ejecucion_trabajo);
                modificar.Parameters.AddWithValue("@condiciones_generales", condiciones_generales);
                modificar.Parameters.AddWithValue("@es_proforma", es_proforma);
                modificar.Parameters.AddWithValue("@cif", cif);
                modificar.Parameters.AddWithValue("@fob", fob);
                modificar.Parameters.AddWithValue("@cod_factura", cod_factura);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("@id", id);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un presupuesto
        /// </summary>
        /// <param name="codigo">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuesto(string codigo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE presupuestos SET activo = @activo WHERE codigo = @codigo";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@codigo", codigo);
                eliminar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuesto()
        {
            DataTable presupuestos = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM presupuestos";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(presupuestos);
                
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                presupuestos = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return presupuestos;
        }

        /// <summary>
        /// Obtiene un presupuesto
        /// </summary>
        /// <param name="codigo">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuesto</returns>
        public presupuestos getPresupuesto(string codigo)
        {
            presupuestos p = new presupuestos();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT * FROM presupuestos WHERE codigo = @codigo";
                consulta.Parameters.AddWithValue("codigo", codigo);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    p.TipoPresupuesto = lector["tipo_presupuesto"].ToString();
                    p.Activo = Convert.ToBoolean(lector["activo"].ToString());
                    p.Cif = Convert.ToDouble(lector["cif"].ToString());
                    p.CodFactura = lector["cod_factura"].ToString();
                    p.Codigo = lector["codigo"].ToString();
                    p.CondicionesGenerales = lector["condiciones_generales"].ToString();
                    p.EjecucionTrabajo = lector["ejecucion_trabajo"].ToString();
                    p.EsProforma = Convert.ToBoolean(lector["es_proforma"].ToString());
                    p.Estado = lector["estado"].ToString();
                    p.Fecha = Convert.ToDateTime(lector["fecha"].ToString());
                    p.Fob = Convert.ToDouble(lector["fob"].ToString());
                    p.FormaPago = lector["forma_pago"].ToString();
                    p.ID = Convert.ToInt16(lector["id"].ToString());
                    p.PlazoEntrega = lector["plazo_entrega"].ToString();
                    p.Precio = Convert.ToDouble(lector["precio"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                p = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return p;
        }

        /// <summary>
        /// Obtiene el mayor indice de la tabla presupuestos
        /// </summary>
        /// <returns>Devuelve un entero con el valor del indice</returns>
        public int getMaxId()
        {
            int maxId = 0;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT MAX(id) FROM presupuestos";
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    maxId = Convert.ToInt16(lector["MAX(id)"].ToString());
                }

                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                maxId = 0;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return maxId;
        }
    }
}
